ELF

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.10
조회수
2
버전
v1

ELF

개요

ELF(Executable and Linkable)는 유닉스 계열 운영체제(Unix-like OS)에서 주로 사용되는 표준 파일 형식으로, 프로그램의 실행 파일, 공유 라이브러리, 오브젝트 파일(object files), 코어 덤프(core dumps) 등을 저장하는 데 활용됩니다. 1990년대 초반에 개발되어 System V Release 4(SVR4)에서 처음 도입되었으며, 현재 리눅스, BSD, Solaris 등 대부분의 유닉스 기반 시스템에서 기본 실행 파일 형식으로 채택되고 있습니다. ELF는 확장성과 유연성을 갖추고 있어 다양한 아키텍처(예: x86, ARM, MIPS)와 운영체제 환경에서 동일한 구조로 사용될 수 있습니다.

ELF 파일의 구조

ELF 파일은 크게 세 가지 구성 요소로 나뉩니다:

  1. ELF 헤더 (ELF Header)
  2. 프로그램 헤더 테이블 (Program Header Table)
  3. 섹션 헤더 테이블 (Section Header Table)

이 구조는 파일이 실행 가능한지, 링크 가능한지에 따라 일부 요소가 생략될 수 있습니다.

ELF 헤더

ELF 헤더는 파일의 가장 앞부분에 위치하며, 전체 파일의 구조를 설명하는 메타데이터를 포함합니다. 주요 필드는 다음과 같습니다:

  • [e_ident](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D/e_ident): ELF 파일의 식별자 (매직 넘버 포함, 예: \x7fELF)
  • [e_type](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D/e_type): 파일 유형 (예: 실행 파일, 공유 라이브러리, 오브젝트 파일)
  • [e_machine](/doc/%EA%B8%B0%EC%88%A0/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4/%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C%20%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98/e_machine): 대상 아키텍처 (예: x86-64, ARM)
  • e_version: ELF 버전
  • [e_entry](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/e_entry): 프로그램의 진입점 주소 (실행 시작 주소)
  • [e_phoff](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/e_phoff): 프로그램 헤더 테이블의 파일 오프셋
  • [e_shoff](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/e_shoff): 섹션 헤더 테이블의 파일 오프셋
  • [e_flags](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D/e_flags): 프로세서 특정 플래그
  • [e_ehsize](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D/e_ehsize), [e_phentsize](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/e_phentsize), [e_shentsize](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/e_shentsize): 각 헤더의 크기

typedef struct {
    unsigned char e_ident[16];
    Elf32_Half    e_type;
    Elf32_Half    e_machine;
    Elf32_Word    e_version;
    Elf32_Addr    e_entry;
    Elf32_Off     e_phoff;
    Elf32_Off     e_shoff;
    Elf32_Word    e_flags;
    Elf32_Half    e_ehsize;
    Elf32_Half    e_phentsize;
    Elf32_Half    e_phnum;
    Elf32_Half    e_shentsize;
    Elf32_Half    e_shnum;
    Elf32_Half    e_shstrndx;
} Elf32_Ehdr;

프로그램 헤더 테이블 (Program Header Table)

프로그램 헤 테이블은 로딩 시 운영체제가 메모리에 프로그램을 어떻게 적재할지를 결정하는 정보를 제공합니다. 각 항목은 "세그먼트(segment)"를 설명하며, 실행 가능한 ELF 파일에 필수입니다.

주요 세그먼트 유형: - [PT_LOAD](/doc/%EA%B8%B0%EC%88%A0/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%A0%81%EC%9E%AC/PT_LOAD): 메모리에 로드해야 하는 세그먼트 - [PT_DYNAMIC](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%8F%99%EC%A0%81%20%EB%A7%81%ED%82%B9/PT_DYNAMIC): 동적 링킹 정보 - [PT_INTERP](/doc/%EA%B8%B0%EC%88%A0/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0/PT_INTERP): 인터프리터 경로 (예: /lib64/ld-linux-x86-64.so.2) - [PT_GNU_STACK](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88/%EC%8A%A4%ED%83%9D%20%EB%B3%B4%ED%98%B8/PT_GNU_STACK): 스택 실행 가능 여부 제어

섹션 헤더 테이블 (Section Header Table)

섹션 헤더 테이블은 링크 시 사용되는 정보를 포함하며, 각 섹션의 이름, 크기, 오프셋 등을 기술합니다. 디버깅 정보, 심볼 테이블, 문자열 테이블 등이 여기에 포함됩니다. 오브젝트 파일이나 디버깅 용도에서 중요합니다.

주요 섹션 예시: - .text: 실행 코드 - .data: 초기화된 전역/정적 변수 - .[bss](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%20%EA%B5%AC%EC%A1%B0/bss): 초기화되지 않은 전역/정적 변수 - .symtab: 심볼 테이블 - .strtab: 문자열 테이블 - .dynamic: 동적 링킹 정보 - .plt: 프로시저 링크 테이블 (PLT) - .got: 전역 오프셋 테이블 (GOT)

ELF 파일 유형

ELF 파일은 e_type 필드를 통해 다음 유형으로 구분됩니다:

이름 설명
1 [ET_REL](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8%20%ED%8C%8C%EC%9D%BC/ET_REL) 리로케이터블 파일 (오브젝트 파일, 예: .o)
2 [ET_EXEC](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC/ET_EXEC) 실행 가능한 파일 (스태틱 바이너리)
3 [ET_DYN](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EA%B3%B5%EC%9C%A0%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/ET_DYN) 공유 오브젝트 파일 (공유 라이브러리 또는 PIC 실행 파일)
4 [ET_CORE](/doc/%EA%B8%B0%EC%88%A0/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/%EB%94%94%EB%B2%84%EA%B9%85/ET_CORE) 코어 덤프 파일

ELF의 활용 사례

  • 리눅스 실행 파일: 대부분의 리눅스 바이너리는 ELF 형식으로 컴파일됩니다.
  • 공유 라이브러리: .so 파일 (예: libc.so.6)은 ELF 형식의 ET_DYN 파일입니다.
  • 정적 라이브러리: .a 파일은 일반적으로 아카이브 형식이지만, 내부 오브젝트 파일은 ELF입니다.
  • 임베디드 시스템: ARM, MIPS 등 다양한 아키텍처에서 ELF를 사용하여 펌웨어를 빌드합니다.
  • 리버스 엔지니어링 및 보안 분석: [readelf](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/readelf), [objdump](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/objdump), hexdump 등의 도구로 ELF 구조를 분석합니다.

ELF 분석 도구

ELF 파일을 분석하고 조작하기 위한 주요 명령어 도구들:

도구 기능
readelf ELF 헤더, 섹션, 심볼, 다이나믹 정보 출력
objdump 오브젝트 파일 디스어셈블, 섹션 정보 출력
[nm](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/nm) 심볼 테이블 출력
[ldd](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%8F%99%EC%A0%81%20%EB%A7%81%ED%82%B9/ldd) 공유 라이브러리 종속성 확인
[file](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D/file) 파일 형식 식별 (ELF인지 확인)

예:

readelf -h /bin/ls        # ELF 헤더 보기
readelf -S /bin/ls        # 섹션 헤더 보기
objdump -d /bin/ls        # 디스어셈블 코드 출력

관련 표준 및 확장

ELF는 Tool Interface Standard (TIS) 문서에서 공식적으로 정의되어 있으며, 다양한 아키텍처에 맞는 확장이 존재합니다. 예를 들어, x86-64, AArch64, RISC-V 등 각 CPU 아키텍처는 고유한 e_machine 값과 ABI(Application Binary Interface)를 정의합니다.

또한, PIE(Position Independent Executable), ASLR(Address Space Layout Randomization), RELRO(Relocation Read-Only) 등의 보안 기법도 ELF의 특성을 활용하여 구현됩니다.

참고 자료

ELF는 현대 소프트웨어 시스템의 핵심 기반 기술 중 하나로, 시스템 프로그래밍, 컴파일러 설계, 보안 분석 등 다양한 분야에서 깊이 이해되어야 하는 중요한 파일 형식입니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?